////#pragma comment(linker,"/STACK:16777216") /*16Mb*/
////#pragma comment(linker,"/STACK:33554432") /*32Mb*/
//#define _CRT_SECURE_NO_DEPRECATE
//#include<iostream>
//#include<numeric>
//#include<sstream>
//#include<cstdio>
//#include<cstdlib>
//#include<cmath>
//#include<memory>
//#include<string>
//#include<vector>
//#include<cctype>
//#include<list>
//#include<queue>
//#include<deque>
//#include<stack>
//#include<map>
//#include<set>
//#include<algorithm>
//using namespace std;
//
//typedef unsigned long long      ui64;
//typedef long long               i64;
//typedef	vector<int>             VI;
//typedef	vector<bool>            VB;
//typedef	vector<VI>              VVI;
//typedef	vector<string>          VS;
//typedef	pair<int,int>           PII;
//typedef map<string,int>         MSI;
//typedef set<int>                SI;
//typedef set<string>             SS;
//typedef map<int,int>            MII;
//typedef	pair<double,double>     PDD;
//
//#define PB                      push_back
//#define MP                      make_pair
//#define X                       first
//#define Y                       second
//#define FOR(i, a, b)            for(int i = (a); i < (b); ++i)
//#define RFOR(i, a, b)           for(int i = (a) - 1; i >= (b); --i)
//#define CLEAR(a, b)             memset(a, b, sizeof(a))
//#define SZ(a)                   int((a).size())
//#define ALL(a)                  (a).begin(), (a).end()
//#define RALL(a)                 (a).rbegin(), (a).rend()
//#define INF                     (2000000000)
//
//const int MAXN = 900+1;
//const int MAXM = 8100+1;
//
//int from[MAXN][MAXM];
//int len[MAXN][MAXM];
//int main()
//{
//	memset(from,-1,sizeof(from));
//	from[0][0] = 0;
//	FOR(i,0,MAXN) {
//		FOR(j,0,MAXM) {
//			if(from[i][j]!=-1) {
//				FOR(k,1,10) if(i+k<MAXN && j+k*k<MAXM ) {
//					if( len[i+k][j+k*k]==len[i][j]+1 ) {
//						from[i+k][j+k*k] = max(k,from[i+k][j+k*k]);
//						len[i+k][j+k*k] = len[i][j]+1;
//					}
//					if( len[i+k][j+k*k]==0 || len[i+k][j+k*k]>len[i][j]+1 ) {
//						from[i+k][j+k*k] = k;
//						len[i+k][j+k*k] = len[i][j]+1;
//					}
//				}
//			}
//		}
//	}
//	int tests;
//	cin >> tests;
//	FOR(test,0,tests) {
//		int n,m;
//		cin >> n >> m;
//		if( (n>=MAXN || m>=MAXM) || len[n][m]==0 ) {
//			cout << "No solution\n";
//			continue;
//		}
//		VI res;
//		while(len[n][m]>0) {
//			int t = from[n][m];
//			res.PB(t);
//			n -= t;
//			m -= t*t;
//		}
//		if(SZ(res)>100) {
//			cout << "No solution\n";
//			continue;
//		}
//		reverse(ALL(res));
//		FOR(i,0,SZ(res))
//			printf("%d",res[i]);
//		printf("\n");
//	}
//	return 0;
//}